package com.reflection;

import com.reflection.bean.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 应用反射的API，获取类的信息(类的名字、属性、方法、构造器等)
 *
 * @author jiangbang
 * @date 2016/8/30
 */
public class Demo03 {
    public static void main(String[] args) {

        String path = "com.bjsxt.test.bean.User";

        try {
            Class<User> clazz = (Class<User>) Class.forName(path);

            //通过反射API调用构造方法，构造对象
            User u = clazz.newInstance();	//其实是调用了User的无参构造方法
            System.out.println(u);

            Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
            User u2 = c.newInstance(1001,18,"高淇二");
            System.out.println(u2.getUname());

            //通过反射API调用普通方法
            User u3 = clazz.newInstance();
            Method method = clazz.getDeclaredMethod("setUname", String.class);
            method.invoke(u3, "高淇三");   //u3.setUname("高淇三");
            System.out.println(u3.getUname());

            //通过反射API操作属性
            User u4 = clazz.newInstance();
            Field f = clazz.getDeclaredField("uname");  //可以获取到非public属性
            f.setAccessible(true); //这个属性不需要做安全检查了，可以直接访问，意思是可以操作非public属性，可以提升性能
            f.set(u4, "高淇四");		//通过反射直接写属性
            System.out.println(u4.getUname());	//通过反射直接读属性的值
            System.out.println(f.get(u4));


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
